package com.polaris.live.ui.live.fragment.base.pager

import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.annotation.CallSuper
import androidx.viewpager.widget.PagerAdapter

/**
 * ViewPager适配器基类
 *
 * @author Created by lucas on 2023/11/8 09:40
 * @since 1.0.0
 */
abstract class BasePagerAdapter<E>(
    /**
     * 上下文对象
     */
    val context: Context,
    /**
     * 数据列表
     */
    private var list: MutableList<E> = mutableListOf()
) : PagerAdapter() {

    /**
     * 删除Item对象
     */
    override fun destroyItem(container: ViewGroup, position: Int, obj: Any) {
        container.removeView(obj as View)
    }

    /**
     * 比较Item对象
     */
    override fun isViewFromObject(view: View, `object`: Any): Boolean {
        return view === `object`
    }

    abstract override fun instantiateItem(container: ViewGroup, position: Int): Any

    /**
     * 返回数据总数
     */
    override fun getCount(): Int {
        return list.size
    }

    /**
     * 获得指定位置的数据
     */
    operator fun get(position: Int): E {
        return list[position]
    }

    /**
     * 判断数据集是否为空
     */
    fun isEmpty(): Boolean {
        return list.isEmpty()
    }

    /**
     * 添加数据到最后
     *
     * @param bean 数据
     */
    @CallSuper
    fun add(bean: E) {
        list.add(bean)
    }

    /**
     * 添加数据集
     *
     * @param list 数据集
     */
    @CallSuper
    fun addAll(list: List<E>): Boolean {
        return this.list.addAll(list)
    }

    /**
     * 删除指定位置的数据
     *
     * @param position 索引
     */
    @CallSuper
    fun remove(position: Int): E {
        return list.removeAt(position)
    }

    /**
     * 清空数据集
     */
    @CallSuper
    fun clear() {
        list.clear()
    }

    /**
     * 获得数据列表
     */
    @CallSuper
    open fun getList(): List<E> {
        return list
    }

    /**
     * 设置数据列表
     *
     * @param list 数据
     */
    fun setList(list: MutableList<E>) {
        this.list = list
    }

    /**
     * 替换数据
     *
     * @param bean     数据
     * @param position 索引
     */
    fun set(bean: E, position: Int) {
        list[position] = bean
    }

    /**
     * 引入布局
     *
     * @param layoutId 布局id
     */
    protected fun inflate(layoutId: Int): View {
        return View.inflate(context, layoutId, null)
    }
}